package linkedList;

/**
 * 根据值删除 -136
 *
 * @author yyz
 * @create 2023-11-21 15:35
 */
public class 根据值删除 {
    /**
     * 在链表中删除值为val的节点（方法1）
     * @param head 链表的头节点
     * @param val 要删除的节点的值
     * @return 删除节点后的链表头节点
     */
    public static ListNode deleteNode(ListNode head, int val) {
        // 创建一个虚拟头节点s，值为-1，指向head
        ListNode s = new ListNode(-1, head);
        // 定义p1指向虚拟头节点，用于遍历链表
        ListNode p1 = s;
        // 定义p2指向p1的下一个节点
        ListNode p2;
        // 遍历链表
        while ((p2 = p1.next) != null) {
            // 如果p2的值不等于要删除的值val，将p1更新为p1.next
            if (p2.val != val) {
                p1 = p1.next;
            } else {
                // 如果p2的值等于要删除的值val，将p1的next指针指向p2的next，实现删除
                p1.next = p2.next;
            }
        }
        // 返回虚拟头节点s的next指针，即删除节点后的链表头节点
        return s.next;
    }

    /**
     * 在链表中删除所有值为val的节点(方法2)
     * @param p 链表的头节点
     * @param val 要删除的节点的值
     * @return 删除节点后的链表头节点
     */
    public static ListNode deleteNode2(ListNode p, int val) {
        // 如果头节点为空，返回null
        if (p == null) {
            return null;
        }
        // 如果头节点的值等于要删除的值val，递归删除p.next中值为val的节点，并返回p.next作为新的头节点
        if (p.val == val) {
            return deleteNode(p.next,val);
        }else {
            // 如果头节点的值不等于要删除的值val，递归删除p.next中值为val的节点，并将其赋值给p.next，然后返回p作为新的头节点
            p.next = deleteNode(p.next,val);
            return p;
        }
    }



    public static void main(String[] args) {
        ListNode list = ListNode.of(1, 2, 6, 5, 3, 6);

        System.out.println(deleteNode2(list, 6));
    }
}
